package main

import (
	"bufio"
	"encoding/json"
	"fmt"
	"os"
	"strings"
)

// User 结构体表示一个用户
type User struct {
	Username string `json:"username"`
	Password string `json:"password"`
	Age      int    `json:"age"`
	Gender   string `json:"gender"`
}

// loadUsers 从JSON文件中加载用户信息
func loadUsers() (map[string]User, error) {
	file, err := os.Open("users.json")
	if err != nil {
		if os.IsNotExist(err) {
			// 如果文件不存在，返回空的用户映射
			return make(map[string]User), nil
		}
		return nil, err
	}
	defer file.Close()

	var users map[string]User
	decoder := json.NewDecoder(file)
	err = decoder.Decode(&users)
	if err != nil {
		return nil, err
	}
	return users, nil
}

// saveUsers 将用户信息保存到JSON文件
func saveUsers(users map[string]User) error {
	file, err := os.Create("users.json")
	if err != nil {
		return err
	}
	defer file.Close()

	encoder := json.NewEncoder(file)
	encoder.SetIndent("", "  ") // 格式化输出，使其更易读
	err = encoder.Encode(users)
	if err != nil {
		return err
	}
	return nil
}

// registerUser 用来注册新用户
func registerUser(users map[string]User) map[string]User {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("请输入用户名: ")
	username, _ := reader.ReadString('\n')
	username = strings.TrimSpace(username)

	if _, exists := users[username]; exists {
		fmt.Println("用户名已存在，请重新输入")
		return users
	}

	fmt.Print("请输入密码: ")
	password, _ := reader.ReadString('\n')
	password = strings.TrimSpace(password)

	fmt.Print("请输入年龄: ")
	ageInput, _ := reader.ReadString('\n')
	var age int
	fmt.Sscanf(ageInput, "%d", &age)

	fmt.Print("请输入性别(男/女): ")
	gender, _ := reader.ReadString('\n')
	gender = strings.TrimSpace(gender)

	users[username] = User{
		Username: username,
		Password: password,
		Age:      age,
		Gender:   gender,
	}
	fmt.Println("注册成功!")
	return users
}

// loginUser 用来验证用户登录
func loginUser(users map[string]User) {
	reader := bufio.NewReader(os.Stdin)
	fmt.Print("请输入用户名: ")
	username, _ := reader.ReadString('\n')
	username = strings.TrimSpace(username)

	fmt.Print("请输入密码: ")
	password, _ := reader.ReadString('\n')
	password = strings.TrimSpace(password)

	if user, ok := users[username]; ok {
		if user.Password == password {
			fmt.Println("登录成功!")
		} else {
			fmt.Println("密码错误!")
		}
	} else {
		fmt.Println("用户不存在!")
	}
}

func main() {
	// 尝试加载用户信息
	users, err := loadUsers()
	if err != nil {
		fmt.Println("加载用户信息时出错:", err)
		os.Exit(1)
	}

	for {
		fmt.Println("请选择操作:")
		fmt.Println("1. 注册")
		fmt.Println("2. 登录")
		fmt.Println("3. 退出")

		reader := bufio.NewReader(os.Stdin)
		choice, _ := reader.ReadString('\n')
		choice = strings.TrimSpace(choice)
		switch choice {
		case "1":
			// 注册新用户
			users = registerUser(users)
			// 保存用户信息到文件
			if err := saveUsers(users); err != nil {
				fmt.Println("保存用户信息时出错:", err)
			}
		case "2":
			// 登录验证
			loginUser(users)
		case "3":
			// 退出程序
			fmt.Println("退出程序")
			os.Exit(0)
		default:
			fmt.Println("无效的选择，请重新输入")
		}
	}
}
